W32: Implement composition check for GDK
authorРуслан Ижбулатов <lrn1986@gmail.com>
Thu, 10 Apr 2014 08:48:13 +0000 (08:48 +0000)
committerРуслан Ижбулатов <lrn1986@gmail.com>
Thu, 10 Apr 2014 17:49:20 +0000 (17:49 +0000)
Also move DWM function grabbing and make those functions available to all of GDK-Win32.

https://bugzilla.gnome.org/show_bug.cgi?id=727316

gdk/win32/gdkmain-win32.c
gdk/win32/gdkprivate-win32.h
gdk/win32/gdkscreen-win32.c
gtk/gtkwindow.c

index 905c729fab98afe0fd5d12db6abbd44b6078327c..5011817f224308df4ac79f6b4b758e893ccabf0b 100644 (file)
@@ -48,6 +48,12 @@ static gboolean gdk_synchronize = FALSE;
 
 static gboolean dummy;
 
+#ifdef HAVE_W32_DWM
+static HMODULE dwmdll = NULL;
+PFN_DwmEnableBlurBehindWindow dwmEnableBlurBehindWindow = NULL;
+PFN_DwmIsCompositionEnabled dwmIsCompositionEnabled = NULL;
+#endif
+
 const GOptionEntry _gdk_windowing_args[] = {
   { "sync", 0, 0, G_OPTION_ARG_NONE, &gdk_synchronize, 
     /* Description of --sync in --help output */              N_("Don't batch GDI requests"), NULL },
@@ -132,6 +138,29 @@ _gdk_win32_windowing_init (void)
   _cf_text_html = RegisterClipboardFormat ("text/html");
 
   _gdk_win32_selection_init ();
+
+/* HAVE_W32_DWM means that we have necessary declarations at compile-time,
+ * but we'd still like to be able to run on XP, so we'll load the functions
+ * we need at runtime.
+ */
+#ifdef HAVE_W32_DWM
+  if (dwmdll == NULL)
+    {
+      dwmdll = LoadLibraryA ("dwmapi.dll");
+      if (dwmdll == NULL)
+        {
+          /* This will make sure that we only try this once */
+          dwmdll = INVALID_HANDLE_VALUE;
+        }
+      else
+        {
+          dwmEnableBlurBehindWindow = (PFN_DwmEnableBlurBehindWindow)
+              GetProcAddress (dwmdll, "DwmEnableBlurBehindWindow");
+          dwmIsCompositionEnabled = (PFN_DwmIsCompositionEnabled)
+              GetProcAddress (dwmdll, "DwmIsCompositionEnabled");
+        }
+    }
+#endif
 }
 
 void
index acc3fcac05cfa2874e8a2f646be688959d4047b5..2482c5d3365c61b709eca540569b9645757b5bda 100644 (file)
 
 #include "config.h"
 
+#ifdef HAVE_W32_DWM
+#include <dwmapi.h>
+typedef HRESULT (WINAPI *PFN_DwmEnableBlurBehindWindow)(HWND,
+    const DWM_BLURBEHIND *);
+typedef HRESULT (WINAPI *PFN_DwmIsCompositionEnabled)(BOOL *pfEnabled);
+extern PFN_DwmEnableBlurBehindWindow dwmEnableBlurBehindWindow;
+extern PFN_DwmIsCompositionEnabled dwmIsCompositionEnabled;
+#endif
+
 /* Make up for some minor w32api or MSVC6 header lossage */
 
 #ifndef PS_JOIN_MASK
@@ -496,6 +505,7 @@ gchar *_gdk_win32_display_manager_get_atom_name (GdkDisplayManager *manager,
                                                 GdkAtom            atom);
 void _gdk_win32_append_event (GdkEvent *event);
 void _gdk_win32_emit_configure_event (GdkWindow *window);
+gboolean _gdk_win32_is_desktop_composition_enabled ();
 
 /* Initialization */
 void _gdk_win32_windowing_init (void);
index d2c2dea1b724ffe744712f755f504ba8a35b396c..2ab8801ad379bdd715076466532e948730671c9e 100644 (file)
@@ -174,6 +174,23 @@ gdk_win32_screen_is_composited (GdkScreen *screen)
 {
   g_return_val_if_fail (GDK_IS_SCREEN (screen), FALSE);
 
+  return _gdk_win32_is_desktop_composition_enabled ();
+}
+
+gboolean
+_gdk_win32_is_desktop_composition_enabled ()
+{
+  BOOL b;
+  DWORD sysver, major, minor;
+  sysver = GetVersion ();
+  major = (DWORD)(LOBYTE (LOWORD (sysver)));
+  minor = (DWORD)(HIBYTE (LOWORD (sysver)));
+  /* Composition is always enabled in W8 */
+  if (major >= 6 && minor >= 2)
+    return TRUE;
+
+  if (dwmIsCompositionEnabled && (S_OK == dwmIsCompositionEnabled (&b)))
+    return b;
   return FALSE;
 }
 
index d7911869bfa738a6af1c7553ee2b5cbe637cdeb8..9104fede9c9df9f706130fa7de3a1f643bc56abc 100644 (file)
@@ -3630,6 +3630,9 @@ gdk_window_supports_csd (GtkWindow *window)
 
       screen = gtk_widget_get_screen (widget);
 
+      if (!gdk_screen_is_composited (screen))
+        return FALSE;
+
       /* We need a visual with alpha */
       visual = gdk_screen_get_rgba_visual (screen);
       if (!visual)